#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

/*

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                      void *(*start_routine) (void *), void *arg);


int pthread_join(pthread_t thread, void **retval);
void pthread_exit(void *retval);

// pthread_attr_t attr;
// int pthread_attr_init(pthread_attr_t *attr);
// int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
// int pthread_attr_destroy(pthread_attr_t *attr);


// int pthread_detach(pthread_t thread);

// pthread_t pthread_self(void);

int pthread_cancel(pthread_t thread);
*/

int pthread_status = 11;

void *start_routine(void *arg)
{
    printf("子线程 %d\n", *((int *)arg));
    while (1)
    {
        printf("world\n");
        sleep(1);
    }
    pthread_exit(&pthread_status); // 线程的自我终止
}

int main()
{
    int count = 1;

    printf("main 单个进程 的主线程\n");

    // 创建一个线程
    pthread_t thread;
    int res = pthread_create(&thread, NULL, start_routine, &count);
    printf("res=%d\n", res);

    while (count < 10)
    {
        printf("hello\n");
        sleep(1);
        count++;
    }

    printf("退出循环 发送取消线程请求\n");
    pthread_cancel(thread);

    // 等待子线程退出(段错误)  主动取消的线程 没有退出值
    void *p = NULL;
    pthread_join(thread, &p);
    printf("%d\n", *((int *)p));

    printf("-=-===========\n");
    pause();

    return 0;
}

//   pthread_cancel(thread);
// 1.立即返回，不会阻塞
// 2.只是发送请求，不保证目标线程立即终止
// 3.发送后继续执行自己的代码